
#import "AFNetManager.h"
#import <sys/utsname.h>
#import <objc/runtime.h>
#import <CommonCrypto/CommonDigest.h>

@implementation AFNetManager

/**
 单例
 */
+ (instancetype)shareManager {
    static AFNetManager *manager = nil;
    static dispatch_once_t once;
    dispatch_once(&once,^{
        manager = [[AFNetManager alloc]init];
    });
    return manager;
}

/**
 GET请求
 
 @param urlString 接口
 @param parameter 参数
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
- (void)getDataWithURLString:(NSString *)urlString
                  parameters:(NSDictionary *)parameter
                     success:(blockForSuccess)success
                     failure:(blockForFailure)failure {
#if !DEBUG
    
    if ([CPGetProxyStatus getProxyStatus]) {//开了代理
        return;
    }
    
#endif
    
    //    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];
    //    [requestSerializer setValue:version forHTTPHeaderField:@"api-version"];
    //    [requestSerializer setValue:ua forHTTPHeaderField:@"api-ua"];
    //    [requestSerializer setValue:[Config getAccess_uid]!=nil?[Config getAccess_uid]:@"" forHTTPHeaderField:@"x-auth-token"];
    //    session.requestSerializer = requestSerializer;
    
    NSString *api_version=[self getVersion];
    NSString *api_ua=[self getDeviceMsg];
    NSString *x_auth_token=[Config getToken];
    NSDictionary *headers = @{
                               @"api-version": api_version!=nil?api_version:@"",
                               @"api-ua":api_ua!=nil?api_ua:@"",
                               @"x-auth-token":x_auth_token!=nil?x_auth_token:@"",
                             };
//    NSLog(@"%@",headers);
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    session.responseSerializer = [AFJSONResponseSerializer serializer];//自动解析网络json
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html", @"text/plain", nil];//设置内容类型
   
    [session GET:urlString parameters:parameter headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSURLResponse *URLResponse=[[NSURLResponse alloc]init];
        // 将AFN获取的数据, 原封不动地返回给controller
        success(URLResponse,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        // 如果请求失败, 也需要执行callBack, 告诉调用者请求失败了,不然调用者会一直等待
        failure(error);
        if([urlString containsString:@"/launch"]){
            return;
        }
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSInteger statusCode = response.statusCode;
        if (statusCode==401) {//token过期 登录过期
            [self showSVProgressHUDStr:@"登录过期，请重新登录"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"loginOvertimeNotification" object:self userInfo:nil];
        }else{
//            [self showSVProgressHUDStr:[NSString stringWithFormat:@"服务器异常！ %ld",(long)statusCode]];
        }
        
    }];
}

/**
 POST请求
 
 @param urlString 接口
 @param parameter 参数
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
- (void)postDataWithURLString:(NSString *)urlString
                   parameters:(NSDictionary *)parameter
                      success:(blockForSuccess)success
                      failure:(blockForFailure)failure {
#if !DEBUG
    
    if ([CPGetProxyStatus getProxyStatus]) {//开了代理
        return;
    }
    
#endif
    NSString *api_version=[self getVersion];
    NSString *api_ua=[self getDeviceMsg];
    NSString *x_auth_token=[Config getToken];
    NSDictionary *headers = @{
                               @"api-version": api_version!=nil?api_version:@"",
                               @"api-ua":api_ua!=nil?api_ua:@"",
                               @"x-auth-token":x_auth_token!=nil?x_auth_token:@"",
                             };
//    NSLog(@"%@",headers);
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    //发送请求
    session.responseSerializer = [AFJSONResponseSerializer serializer];//自动解析网络json
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html", @"text/plain", nil];//设置内容类型
    
    [session POST:urlString parameters:parameter headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSURLResponse *URLResponse=[[NSURLResponse alloc]init];
        success(URLResponse,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSInteger statusCode = response.statusCode;
        if (statusCode==401) {//token过期 登录过期
            [self showSVProgressHUDStr:@"登录过期，请重新登录"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"loginOvertimeNotification" object:self userInfo:nil];
        }else{
//            [self showSVProgressHUDStr:[NSString stringWithFormat:@"服务器异常！ %ld",(long)statusCode]];
        }
    }];
}


/**
 delect请求
 
 @param urlString 接口
 @param parameter 参数
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
- (void)delectDataWithURLString:(NSString *)urlString
                   parameters:(NSDictionary *)parameter
                      success:(blockForSuccess)success
                        failure:(blockForFailure)failure{
#if !DEBUG
    
    if ([CPGetProxyStatus getProxyStatus]) {//开了代理
        return;
    }
    
#endif
    NSString *api_version=[self getVersion];
    NSString *api_ua=[self getDeviceMsg];
    NSString *x_auth_token=[Config getToken];
    NSDictionary *headers = @{
                               @"api-version": api_version!=nil?api_version:@"",
                               @"api-ua":api_ua!=nil?api_ua:@"",
                               @"x-auth-token":x_auth_token!=nil?x_auth_token:@"",
                             };
//    NSLog(@"%@",headers);
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    //发送请求
    session.responseSerializer = [AFJSONResponseSerializer serializer];//自动解析网络json
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html", @"text/plain", nil];//设置内容类型
    [session DELETE:urlString parameters:parameter headers:headers success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSURLResponse *URLResponse=[[NSURLResponse alloc]init];
        success(URLResponse,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSInteger statusCode = response.statusCode;
        if (statusCode==401) {//token过期 登录过期
            [self showSVProgressHUDStr:@"登录过期，请重新登录"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"loginOvertimeNotification" object:self userInfo:nil];
        }else{
//            [self showSVProgressHUDStr:[NSString stringWithFormat:@"服务器异常！ %ld",(long)statusCode]];
        }
    }];
}

/**
 上传单张图片接口
 
 @param URLString 接口
 @param parameters 参数
 @param data 图片
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
-(void)uploadWithURLString:(NSString *)URLString
                parameters:(id)parameters
               uploadParam:(NSData*)data
                   success:(blockForSuccess)success
                   failure:(blockForFailure)failure{
    
    // 网址
    URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    // 创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
    responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/x-json", nil];
    manager.responseSerializer = responseSerializer;
    
    [manager POST:URLString parameters:parameters headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        // 设置时间格式
        formatter.dateFormat = @"yyyyMMddHHmmss";
        NSString *str = [formatter stringFromDate:[NSDate date]];
        NSString *fileName = [NSString stringWithFormat:@"%@.jpg", str];
        
        //这个就是参数
        [formData appendPartWithFileData:data name:@"filename" fileName:fileName mimeType:@"image/jpeg"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"%@",uploadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        responseObject = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
        success(nil,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
        
    }];
}

-(void)showSVProgressHUDStr:(NSString *)str{
    if ([str isKindOfClass:[NSNull class]]||str==nil||[str isEqualToString:@""]) {
        return;
    }
    [SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];
    [SVProgressHUD showImage:[UIImage imageNamed:@""] status:str];
}

/**
 上传多张图片接口
 
 @param URLString 接口
 @param parameters 参数
 @param dataArr 图片数组
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
-(void)uploadArrWithURLString:(NSString *)URLString
                   parameters:(id)parameters
                  uploadParam:(NSArray*)dataArr
                      success:(blockForSuccess)success
                      failure:(blockForFailure)failure {
    
    // 网址
    URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // 创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
    responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];
    
    manager.responseSerializer = responseSerializer;
    
    [manager POST:URLString parameters:parameters headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (int i = 0; i < dataArr.count; i++) {
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"yyyyMMddHHmmss"];
            NSString *dateString = [formatter stringFromDate:[NSDate date]];
            NSString *fileName = [NSString  stringWithFormat:@"%@.jpg", dateString];
            
            [formData appendPartWithFileData:dataArr[i] name:[NSString  stringWithFormat:@"upload%d", i] fileName:fileName mimeType:@"image/jpeg"]; //
        }
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"%@",uploadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        responseObject = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
        success(nil,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
    }];
}
-(NSString *)getVersion{
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *version=[NSString stringWithFormat:@"%@",[infoDictionary objectForKey:@"CFBundleShortVersionString"]];
    return version;
}
- (NSString *)getDeviceMsg{
    //手机的系统版本
    UIDevice *device = [UIDevice currentDevice];
    NSString *systemVersion = [device systemVersion];
    //手机型号
    NSString *deviceModelName=[self getDeviceModelName];
    //umid
    NSString *deviceUUID = [[UIDevice currentDevice].identifierForVendor UUIDString];//设备uuid
    NSMutableString *tmpResult = deviceUUID.mutableCopy;
    // 去除“-”
    NSRange range = [tmpResult rangeOfString:@"-"];
    while (range.location != NSNotFound) {
        [tmpResult deleteCharactersInRange:range];
        range = [tmpResult rangeOfString:@"-"];
    }
//    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"zjddDeviceUUID" accessGroup:nil];
//    NSString *ss=[keychain objectForKey:(__bridge id)(kSecAttrAccount)];
//    if ([ss isEqualToString:@""]||ss==nil) {
//        [keychain setObject:tmpResult forKey:(__bridge id)(kSecAttrAccount)];
//    }
//    KeychainItemWrapper *keychain1 = [[KeychainItemWrapper alloc] initWithIdentifier:@"zjddDeviceUUID" accessGroup:nil];// 通过同样的标志创建keychain
//    NSString *UUID = [keychain1 objectForKey:(__bridge id)(kSecAttrAccount)];
//    NSLog(@"UUID:%@",UUID);
    
    NSString *imei=@"";
    NSString *iosid=@"";
    
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
//    CFShow((__bridge CFTypeRef)(infoDictionary));
    // app名称
    NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    app_Name=@"huatang";
    //app版本
    NSString *version=[NSString stringWithFormat:@"%@",[infoDictionary objectForKey:@"CFBundleShortVersionString"]];
    //渠道
//    NSString *channel=app_channel;
//    NSString *ua = [NSString stringWithFormat:@"(ios%@/Apple_%@/%@/%@/%@) %@/%@/%@",systemVersion,deviceModelName,UUID,imei,iosid,app_Name,version,channel];
    
    return @"";
}

//获取设备型号名称
- (NSString *)getDeviceModelName{
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if (!deviceString) return @"iPhone";
    //iPhone
    if ([deviceString isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,2"])    return @"Verizon iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,3"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([deviceString isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
    if ([deviceString isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([deviceString isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([deviceString isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([deviceString isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([deviceString isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([deviceString isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([deviceString isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    if ([deviceString isEqualToString:@"iPhone9,1"])    return @"iPhone 7"; //国行、日版、港行
    if ([deviceString isEqualToString:@"iPhone9,2"])    return @"iPhone 7 Plus"; //国行、港行
    if ([deviceString isEqualToString:@"iPhone9,3"])    return @"iPhone 7"; //美版、台版
    if ([deviceString isEqualToString:@"iPhone9,4"])    return @"iPhone 7 Plus"; //美版、台版
    if ([deviceString isEqualToString:@"iPhone10,1"])    return @"iPhone 8"; //国行(A1863)、日行(A1906)
    if ([deviceString isEqualToString:@"iPhone10,2"])    return @"iPhone 8 Plus"; //国行(A1864)、日行(A1898)
    if ([deviceString isEqualToString:@"iPhone10,3"])    return @"iPhone X"; //国行(A1865)、日行(A1902)
    if ([deviceString isEqualToString:@"iPhone10,4"])    return @"iPhone 8"; //美版(Global/A1905)
    if ([deviceString isEqualToString:@"iPhone10,5"])    return @"iPhone 8 Plus"; //美版(Global/A1897)
    if ([deviceString isEqualToString:@"iPhone10,6"])    return @"iPhone X";//美版(Global/A1901)
    if ([deviceString isEqualToString:@"iPhone11,8"])    return @"iPhone XR";
    if ([deviceString isEqualToString:@"iPhone11,2"])    return @"iPhone XS";
    if ([deviceString isEqualToString:@"iPhone11,6"])    return @"iPhone XS Max";
    if ([deviceString isEqualToString:@"iPhone11,4"])    return @"iPhone XS Max";
    if ([deviceString isEqualToString:@"iPhone12,1"])    return @"iPhone 11";
    if ([deviceString isEqualToString:@"iPhone12,3"])    return @"iPhone 11 Pro";
    if ([deviceString isEqualToString:@"iPhone12,5"])    return @"iPhone 11 Pro Max";
    if ([deviceString isEqualToString:@"iPhone12,8"])    return @"iPhone SE"; //(2nd generation)
    if ([deviceString isEqualToString:@"iPhone13,1"])    return @"iPhone 12 mini";
    if ([deviceString isEqualToString:@"iPhone13,2"])    return @"iPhone 12";
    if ([deviceString isEqualToString:@"iPhone13,3"])    return @"iPhone 12 Pro";
    if ([deviceString isEqualToString:@"iPhone13,4"])    return @"iPhone 12 Pro Max";
    if ([deviceString isEqualToString:@"iPhone14,2"])    return @"iPhone 13 Pro";
    if ([deviceString isEqualToString:@"iPhone14,3"])    return @"iPhone 13 Pro Max";
    if ([deviceString isEqualToString:@"iPhone14,4"])    return @"iPhone 13 mini";
    if ([deviceString isEqualToString:@"iPhone14,5"])    return @"iPhone 13";
    if ([deviceString isEqualToString:@"iPhone14,6"])    return @"iPhone SE"; //(2nd generation)
    if ([deviceString isEqualToString:@"iPhone14,7"])    return @"iPhone 14";
    if ([deviceString isEqualToString:@"iPhone14,8"])    return @"iPhone 14 Plus";
    if ([deviceString isEqualToString:@"iPhone15,2"])    return @"iPhone 14 Pro";
    if ([deviceString isEqualToString:@"iPhone15,3"])    return @"iPhone 14 Pro Max";
    
    if ([deviceString isEqualToString:@"iPhone15,4"])    return @"iPhone 15";
    if ([deviceString isEqualToString:@"iPhone15,5"])    return @"iPhone 15 Plus";
    if ([deviceString isEqualToString:@"iPhone16,1"])    return @"iPhone 15 Pro";
    if ([deviceString isEqualToString:@"iPhone16,2"])    return @"iPhone 15 Pro Max";
    
    //iPad
    if ([deviceString isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([deviceString isEqualToString:@"iPad1,2"])      return @"iPad 3G";
    
    if ([deviceString isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,2"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([deviceString isEqualToString:@"iPad2,4"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,6"])      return @"iPad Mini";
    if ([deviceString isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    
    if ([deviceString isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad3,3"])      return @"iPad 3";
    if ([deviceString isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,5"])      return @"iPad 4";
    if ([deviceString isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    
    if ([deviceString isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,3"])      return @"iPad Air";
    
    if ([deviceString isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,6"])      return @"iPad Mini 2";
    
    if ([deviceString isEqualToString:@"iPad4,7"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,8"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,9"])      return @"iPad Mini 3";
    
    if ([deviceString isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (LTE)";
    if ([deviceString isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
    if ([deviceString isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
    
    if ([deviceString isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9";
    if ([deviceString isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9";
    
    if ([deviceString isEqualToString:@"iPad6,11"])     return @"iPad 5th";
    if ([deviceString isEqualToString:@"iPad6,12"])     return @"iPad 5th";
    
    if ([deviceString isEqualToString:@"iPad7,1"])      return @"iPad Pro 12.9 2nd";
    if ([deviceString isEqualToString:@"iPad7,2"])      return @"iPad Pro 12.9 2nd";
    if ([deviceString isEqualToString:@"iPad7,3"])      return @"iPad Pro 10.5";
    if ([deviceString isEqualToString:@"iPad7,4"])      return @"iPad Pro 10.5";
    
    if ([deviceString isEqualToString:@"iPad7,5"])      return @"iPad 6th";
    if ([deviceString isEqualToString:@"iPad7,6"])      return @"iPad 6th";
    
    if ([deviceString isEqualToString:@"iPad8,1"])      return @"iPad Pro 11";
    if ([deviceString isEqualToString:@"iPad8,2"])      return @"iPad Pro 11";
    if ([deviceString isEqualToString:@"iPad8,3"])      return @"iPad Pro 11";
    if ([deviceString isEqualToString:@"iPad8,4"])      return @"iPad Pro 11";
    
    if ([deviceString isEqualToString:@"iPad8,5"])      return @"iPad Pro 12.9 3rd";
    if ([deviceString isEqualToString:@"iPad8,6"])      return @"iPad Pro 12.9 3rd";
    if ([deviceString isEqualToString:@"iPad8,7"])      return @"iPad Pro 12.9 3rd";
    if ([deviceString isEqualToString:@"iPad8,8"])      return @"iPad Pro 12.9 3rd";
    
    if ([deviceString isEqualToString:@"iPad11,1"])      return @"iPad mini 5th";
    if ([deviceString isEqualToString:@"iPad11,2"])      return @"iPad mini 5th";
    if ([deviceString isEqualToString:@"iPad11,3"])      return @"iPad Air 3rd";
    if ([deviceString isEqualToString:@"iPad11,4"])      return @"iPad Air 3rd";
    
    if ([deviceString isEqualToString:@"iPad11,6"])      return @"iPad 8th";
    if ([deviceString isEqualToString:@"iPad11,7"])      return @"iPad 8th";
    
    if ([deviceString isEqualToString:@"iPad12,1"])      return @"iPad 9th";
    if ([deviceString isEqualToString:@"iPad12,2"])      return @"iPad 9th";
    
    if ([deviceString isEqualToString:@"iPad14,1"])      return @"iPad mini 6th";
    if ([deviceString isEqualToString:@"iPad14,2"])      return @"iPad mini 6th";
    
    //iPod
    if ([deviceString isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([deviceString isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([deviceString isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([deviceString isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([deviceString isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";
    if ([deviceString isEqualToString:@"iPod7,1"])      return @"iPod Touch (6 Gen)";
    if ([deviceString isEqualToString:@"iPod9,1"])      return @"iPod Touch (7 Gen)";
    
    if ([deviceString isEqualToString:@"i386"])         return @"Simulator";
    if ([deviceString isEqualToString:@"x86_64"])       return @"Simulator";
    
    return deviceString;
}


- (NSString *)randomNoNumber: (int)len {
    char ch[len];
    for (int index=0; index<len; index++) {
        
        int num = arc4random_uniform(58)+65;
        if (num>90 && num<97) { num = num%90+65; }
        ch[index] = num;
    }
    return [[NSString alloc] initWithBytes:ch length:len encoding:NSUTF8StringEncoding];
}

/**
 POST请求
 
 @param urlString 接口
 @param parameter 参数
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
- (void)postDataWithURLString:(NSString *)urlString
                         path:(NSString *)path
                   parameters:(NSDictionary *)parameter
                      success:(blockForSuccess)success
                      failure:(blockForFailure)failure {
#if !DEBUG
    
    if ([CPGetProxyStatus getProxyStatus]) {//开了代理
        return;
    }
    
#endif

    //random
    int randomNumber = arc4random_uniform(9000)+1000;
    NSString *randomStr=[NSString stringWithFormat:@"%d",randomNumber];
    //timestamp
    NSString *timeStamp=[self gs_getCurrentTimeStringToMilliSecond];
    
    //MD5加密值（path + timestamp + random + requestKey）
    NSString *RequestId=[NSString stringWithFormat:@"%@%@%d%@",path,timeStamp,randomNumber,requestKey];
    NSString *md5=[self md5:RequestId];

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *version=[NSString stringWithFormat:@"%@",[infoDictionary objectForKey:@"CFBundleShortVersionString"]];
    
   
    NSString *ID=[NSString stringWithFormat:@"%@",[Config getID]];
    NSString *token=[NSString stringWithFormat:@"%@",[Config getToken]];
    NSDictionary *headers = @{
                               @"referer":baseUrl,//服务器地址
                               @"Request-Version":version,//客户端版本号
                               @"Request-Package-Mark":@"4",//包标识
                               @"Request-Platform":@"1",//平台标识
                               @"Request-Channel":@"ios",//渠道标识
                               @"Request-Market":@"1",//市场标识
                               @"Request-Simulator":@"ios",//是否模拟器
                               @"Request-Device-Type":@"2",// 设备类型（安卓:1, 苹果:2）
                               
                               @"Request-Device":@"",//安卓:OAID、苹果:IDFV（需加密）
                               @"Request-Device-Agent":@"",//安卓:AndroidID、苹果:IDFV（需加密）
                               @"Request-Device-Model":@"",//设备型号
                               
                               @"Request-Random":randomStr,//random 4位随机数(如"0123")
                               @"Request-Timestamp":timeStamp,//timeStamp 当前时间戳（毫秒）
                               @"Request-Id":md5,//MD5加密值（path + timestamp + random + requestKey）
                               @"Request-Uid":ID!=nil?ID:@"",//用户ID（登录后必传）
                               @"authorization":token!=nil?token:@"",//用户token（登录后必传）
                               [self randomNoNumber:4]:[self randomNoNumber:4],
                               [self randomNoNumber:5]:[self randomNoNumber:5],
                               [self randomNoNumber:6]:[self randomNoNumber:6],
                               [self randomNoNumber:5]:[self randomNoNumber:5],
                               [self randomNoNumber:4]:[self randomNoNumber:4],
                             };
//    NSLog(@"%@",headers);
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    //发送请求
    session.responseSerializer = [AFJSONResponseSerializer serializer];//自动解析网络json
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html", @"text/plain", nil];//设置内容类型
    
    [session POST:urlString parameters:parameter headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSURLResponse *URLResponse=[[NSURLResponse alloc]init];
        success(URLResponse,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
        
        if([urlString containsString:@"/system/open_app_config"]){
            return;
        }
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSInteger statusCode = response.statusCode;
        if (statusCode==401) {//token过期 登录过期
            [self showSVProgressHUDStr:@"登录过期，请重新登录"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"loginOvertimeNotification" object:self userInfo:nil];
        }else{
//            [self showSVProgressHUDStr:[NSString stringWithFormat:@"服务器异常！ %ld",(long)statusCode]];
        }
    }];
}


/**
 GET请求
 
 @param urlString 接口
 @param parameter 参数
 @param success 请求成功的回调
 @param failure 请求失败的回调
 */
- (void)getDataWithURLString:(NSString *)urlString
                        path:(NSString *)path
                  parameters:(NSDictionary *)parameter
                     success:(blockForSuccess)success
                     failure:(blockForFailure)failure {
#if !DEBUG
    
    if ([CPGetProxyStatus getProxyStatus]) {//开了代理
        return;
    }
    
#endif
    
    //    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];
    //    [requestSerializer setValue:version forHTTPHeaderField:@"api-version"];
    //    [requestSerializer setValue:ua forHTTPHeaderField:@"api-ua"];
    //    [requestSerializer setValue:[Config getAccess_uid]!=nil?[Config getAccess_uid]:@"" forHTTPHeaderField:@"x-auth-token"];
    //    session.requestSerializer = requestSerializer;
    
 
    //random
    int randomNumber = arc4random_uniform(9000)+1000;
    NSString *randomStr=[NSString stringWithFormat:@"%d",randomNumber];
    //timestamp
    NSString *timeStamp=[self gs_getCurrentTimeStringToMilliSecond];
    
    //MD5加密值（path + timestamp + random + requestKey）
    NSString *RequestId=[NSString stringWithFormat:@"%@%@%d%@",path,timeStamp,randomNumber,requestKey];
    NSString *md5=[self md5:RequestId];

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *version=[NSString stringWithFormat:@"%@",[infoDictionary objectForKey:@"CFBundleShortVersionString"]];
    NSString *ID=[NSString stringWithFormat:@"%@",[Config getID]];
    NSString *token=[NSString stringWithFormat:@"%@",[Config getToken]];
    NSDictionary *headers = @{
                               @"referer":baseUrl,//服务器地址
                               @"Request-Version":version,//客户端版本号
                               @"Request-Package-Mark":@"4",//包标识
                               @"Request-Platform":@"1",//平台标识
                               @"Request-Channel":@"ios",//渠道标识
                               @"Request-Market":@"1",//市场标识
                               @"Request-Simulator":@"ios",//是否模拟器
                               @"Request-Device-Type":@"2",// 设备类型（安卓:1, 苹果:2）
                               
                               @"Request-Device":@"",//安卓:OAID、苹果:IDFV（需加密）
                               @"Request-Device-Agent":@"",//安卓:AndroidID、苹果:IDFV（需加密）
                               @"Request-Device-Model":@"",//设备型号
                               
                               @"Request-Random":randomStr,//random 4位随机数(如"0123")
                               @"Request-Timestamp":timeStamp,//timeStamp 当前时间戳（毫秒）
                               @"Request-Id":md5,//MD5加密值（path + timestamp + random + requestKey）
                               @"Request-Uid":ID!=nil?ID:@"",//用户ID（登录后必传）
                               @"authorization":token!=nil?token:@"",//用户token（登录后必传）
                               [self randomNoNumber:4]:[self randomNoNumber:4],
                               [self randomNoNumber:5]:[self randomNoNumber:5],
                               [self randomNoNumber:6]:[self randomNoNumber:6],
                               [self randomNoNumber:5]:[self randomNoNumber:5],
                               [self randomNoNumber:4]:[self randomNoNumber:4],
                               
                             };
//    NSLog(@"%@",headers);
    
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    session.responseSerializer = [AFJSONResponseSerializer serializer];//自动解析网络json
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html", @"text/plain", nil];//设置内容类型
    
    [session GET:urlString parameters:parameter headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSURLResponse *URLResponse=[[NSURLResponse alloc]init];
        // 将AFN获取的数据, 原封不动地返回给controller
        success(URLResponse,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        // 如果请求失败, 也需要执行callBack, 告诉调用者请求失败了,不然调用者会一直等待
        failure(error);
        if([urlString containsString:@"/launch"]){
            return;
        }
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSInteger statusCode = response.statusCode;
        if (statusCode==401) {//token过期 登录过期
            [self showSVProgressHUDStr:@"登录过期，请重新登录"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"loginOvertimeNotification" object:self userInfo:nil];
        }else{
//            [self showSVProgressHUDStr:[NSString stringWithFormat:@"服务器异常！ %ld",(long)statusCode]];
        }
        
    }];
}



- (NSString *)gs_getCurrentTimeStringToMilliSecond {
    double currentTime =  [[NSDate date] timeIntervalSince1970]*1000;
    NSString *strTime = [NSString stringWithFormat:@"%.0f",currentTime];
    return strTime;
}

//MD5加密
- (NSString *) md5:(NSString *) input {
    if (input==nil) {
        input=@"";
    }
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr,(CC_LONG)strlen(cStr), digest ); // This is the md5 call
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

@end
